/**
 * Copyright (C), 2007-2009, 十五科技有限公司
 * File Name: CheckboxSelectUtils.js
 * Encoding: UTF-8
 * Version: 1.0
 * Date: Apr 25, 2008
 * History:	
 */

/**
 * 复选框工具JS
 * 
 * @author 胡克雷(hukl424@163.com)
 * @version Revision: 1.00 Date: Apr 25, 2008
 */
CheckboxSelectUtils = new Object();

/**
 * 判断具有“checked”属性的元素集合中是否至少有一个“checked”属性为true，即被选中
 * 
 * @items 具有“checked”属性的元素集合
 * @return {Boolean}
 */
CheckboxSelectUtils.isAnyChecked = function(items) {
	if(!items) return false;
	
	//如果items没有length属性，那么就把它当作一个复选框元素看待
	if(!items.length) {
		if(items.checked) return true;
		return false;
	} 	
	
	for(var i = 0,ilen=items.length; i < ilen; i++) {
		if(items[i].checked) 
			return true;
	}
	
	return false;
}
/**
 * 判断选中的value是多少
 * by zhengzhp at 2009-09-21
 * @items 具有“checked”属性的元素集合
 * @return 
 */
CheckboxSelectUtils.isCheckedValue = function(items) {
	if(!items) return "";
	
	//如果items没有length属性，那么就把它当作一个复选框元素看待
	if(!items.length) {
		if(items.checked) return items.value;
		return "";
	} 	
	
	for(var i = 0,ilen=items.length; i < ilen; i++) {
		if(items[i].checked) 
		   return items[i].value;
	}
	return "";
}

/**
 * 判断选中的value是多少,以数组返回
 * by zhengzhp at 2009-09-25
 * @items 具有“checked”属性的元素集合
 * @return String[]
 */
CheckboxSelectUtils.isCheckedValues = function(items) {
	var checkboxarray=new Array();
	if(!items) 
	{
	    checkboxarray.push("");
	    return checkboxarray;
	}
	//如果items没有length属性，那么就把它当作一个复选框元素看待
	if(!items.length) {
		if(items.checked)
		  {
		  	checkboxarray.push(items.value);
		     return checkboxarray;
		  }
		checkboxarray.push("");
 		return checkboxarray;
	} 	
	
	for(var i = 0,ilen=items.length; i < ilen; i++) {
		if(items[i].checked) 
		{
			 checkboxarray.push(items[i].value);
		}
	}
	checkboxarray.push("");
	return checkboxarray;
}
/**
 * 实现了一系列复选框的全选/全不选,并支持全选/全不选后复选框一些回调操作
 * 
 * @param checkState{Element} 具有全选功能的那个元素的选中状态
 * @param referenceItems {Element List/Element Array} 与具有全选功能的那个元素的状态联动的一系列复选框元素
 * @param selectedCallback{Function} 回调操作
 */
CheckboxSelectUtils.selectAll = function(checkedState, referenceItems, selectedCallback) {
	
	if(!referenceItems) return;
	//如果referenceItems没有length属性，那么就把它当作一个复选框元素看待
	if(!referenceItems.length) {
		referenceItems.checked = checkedState;
		return;
	}
	 
	for(var i = 0,ilen=referenceItems.length; i < ilen; i++) {
		referenceItems[i].checked = checkedState;
		if(selectedCallback)
			selectedCallback(referenceItems[i]);
	}
};

/**
 * 计算一组复选框中已被选中的复选框的个数
 * 
 * @param checkboxItems 复选框集合
 * @return {Integer}
 */
CheckboxSelectUtils.calcuCheckedboxes = function(checkboxItems) {
	if(!checkboxItems) return 0;
	
	var count = 0;
	if(!checkboxItems.length) {
		count = 0;
	}
	for(var i = 0,ilen=checkboxItems.length; i < ilen; i++) {
		if(checkboxItems[i].checked)
			count++;
	}
	
	return count;
};

/**
 * 根据复选框的状态改变复选框所在行的样式，主要用在列表页中
 * 
 * @param checkItem {Element} 复选框
 * @param checkedCls {String} 复选框选中时的样式
 * @param cancelCls {String} 复选框未选中时的样式
 */
CheckboxSelectUtils.changeTRStyleByCheckState = function(checkItem, checkedCls, cancelCls) {
	var contaniner = CheckboxSelectUtils.getContainerForCheckbox(checkItem);
	if (checkItem.checked) {
		contaniner.className = checkedCls || "checked_cls";
	} else {
		contaniner.className = cancelCls || "cancel_cls";
	}
};

/**
 * 获取包含复选框的上层元素(不一定是父节点)
 * 
 * @param checkItem {Element} 复选框
 */
CheckboxSelectUtils.getContainerForCheckbox = function(checkItem) {
	return checkItem.parentNode.parentNode;
};